/**
      <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <2011>  <André Mendes de Oliveira Paiva>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
 */

package estrutura;

import java.util.ArrayList;

public abstract class EstruturaDados {

    private String nome;
    private int qtdeNo;
    private int qtdeLigacao;
    public static final int QTDE_MAX_NO = 50;
    
     
    
    public static final String NOME_ESTRUTURA_ANONIMA = "<Anonima>";

    public EstruturaDados(String nome, int qtdeNo) {
        this.setNome(nome);
        this.setQtdeNo(qtdeNo);
    }
    public EstruturaDados(String nome) {
        this(nome, QTDE_MAX_NO);
    }
    public EstruturaDados(int qtdeNo) {
        this(NOME_ESTRUTURA_ANONIMA, qtdeNo);
    }

    public EstruturaDados() {
        this(NOME_ESTRUTURA_ANONIMA, QTDE_MAX_NO);
    }

    public void setQtdeNo(int qtdeNo) {
        this.qtdeNo = qtdeNo;
    }

    public int getQtdeNo() {
        return this.qtdeNo;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return this.nome;
    }

    public void imprimir() {
        System.out.println(this.toString());
    }

    @Override
    public String toString() {
        return "Estrutura: " + this.getNome() + " - Maximo Numero de Nos: " + this.getQtdeNo();
    }

    public abstract boolean inserirNo(String valor);

    public abstract boolean inserirAresta(int idNoOrigem, int idNoDestino);

    public abstract boolean inserirAresta(int idNoOrigem, int idNoDestino, Object rotulo);

    public abstract boolean inserirAresta(int idNoOrigem, int idNoDestino, Object rotulo, int peso);

    public abstract boolean inserirRotulo(int idNoOrigem, int idNoDestino, Object rotulo);

    public abstract boolean excluirNo(int idNo);

    public abstract boolean excluirRotulo(int idNoOrigem, int idNoDestino);

    public abstract boolean excluirAresta(int idNoOrigem, int idNoDestino);
    
    public abstract boolean excluirTodasArestas(int idNo);

    public abstract int obterIndiceNo(int idNo);

    public abstract int obterIdPorValor(String valor);

    public abstract int obterIDPrimeiraAresta(int idNo);

    public abstract int obterIDProximaAresta(int idNoOrigem, int idNoDestino);

    public abstract Aresta obterAresta(int idNoOrigem, int idNoDestino);

    public abstract Object obterRotuloAresta(int idNoOrigem, int idNoDestino);

    public abstract boolean obterDadosArquivo(String arquivo);

    public abstract boolean gerarArquivoEstrutura(String arquivo);

    public abstract int obterIDNoOrigem();

    public abstract int obterIDNoDestino();

    public abstract void imprimirNosVizinhos(int id);

    public abstract No obterNoPorID(int idNo);

    public abstract ArrayList<No> obterVertices();
    
    public abstract ArrayList<No> obterNosVizinhos(int idNo);
    public abstract No obterNo(int idNo);
}
